/*
 *循环队列及功能
 *@author 寇戈
 *@version 1.0 , 2021-10-20
 */
#include <iostream>
#include <malloc.h>
#include "myhead.h"

using namespace std;

#define MAXQSIZE 100
typedef struct
{
    //循环队列的结构
    ElemType *base;
    int front, rear;
} SqQueue;

Status InitQueue(SqQueue &Q)
{
    /*
     *循环队列的初始化
     */
    Q.base = (ElemType *)malloc(sizeof(ElemType) * MAXQSIZE);
    if (!Q.base)
        exit(OVERFLOW);
    Q.front = Q.rear = 0;
    return OK;
}

int QueueLength(SqQueue Q)
{
    /*
     *输出循环列表Q的长度
     */

    return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}
bool QueueEmpty(SqQueue Q)
{
    /*
     *判断循环列表Q是否为空
     */

    return Q.front == Q.rear;
}

bool QueueFull(SqQueue Q)
{
    /*
     *判断循环列表Q是否已满
     */

    return (Q.rear + 1) % MAXQSIZE == Q.front;
}

Status EnQueue(SqQueue &Q, ElemType e)
{
    /*
     *入队
     */

    if (QueueFull(Q))
        return ERROR;
    Q.base[Q.rear] = e;
    Q.rear = (Q.rear + 1) % MAXQSIZE;
    return OK;
}

Status DelQueue(SqQueue &Q, ElemType e)
{
    /*
     *出队
     */

    if (QueueEmpty(Q))
        return ERROR;
    Q.front = (Q.front + 1) % MAXQSIZE;
    return OK;
}

Status showQueue_dev(SqQueue Q)
{
    if (QueueEmpty(Q))
    {
        cout << "队列为空\n\n";
        return OK;
    }

    cout << "当前队列中元素为:";
    for (int i = 0; i < QueueLength(Q); i++)
    {
        cout << Q.base[(Q.front + i) % MAXQSIZE] << " ";
    }
    cout << endl
         << endl;
    return OK;
}

// Status Test_dev(SqQueue &Q)
// {
//     /*
//      * 队列的操作测试(仅开发时使用)
//      */
//     cout << "请选择操作：\n1.入队测试\n2.出队测试\n3.队是否为空测试\nf.停止测试\n\n";
//     char op;
//     ElemType e;
//     cin >> op;
//     switch (op)
//     {
//     case '1':
//         cout << "请输入要入队的元素：\n";
//         cin >> e;
//         EnQueue(Q, e);
//         showQueue_dev(Q);
//         break;
//     case '2':
//         if (!DelQueue(Q, e))
//             cout << "不能出队列,因为";
//         else
//             cout << "弹出的元素:" << e << endl;
//         showQueue_dev(Q);
//         break;
//     case '3':
//         cout << (QueueEmpty(Q) ? "队列为空\n\n" : "队列不为空\n\n");
//         break;
//     case 'f':
//         exit(OK);
//         break;
//     default:
//         break;
//     }
// }
// int main()
// {
//     //初始化队列
//     SqQueue Q1;
//     InitQueue(Q1);

//     //队列操作测试
//     while (true)
//     {
//         Test_dev(Q1);
//     }
// }